import { resolve } from 'path'
import type { ConfigEnv, UserConfig } from 'vite'
import { loadEnv } from 'vite' // Vite 内置的 env 加载方法，比手动解析 argv 更可靠
import { createVitePlugins } from './build/vite'
import { exclude, include } from "./build/vite/optimize"

// 当前执行 node 命令时的工作目录（固定写法）
const root = process.cwd()

// 路径查找工具函数（保持不变）
function pathResolve(dir: string) {
  return resolve(root, '.', dir)
}

// Vite 配置主函数
export default ({ command, mode }: ConfigEnv): UserConfig => {
  // 1. 优化：使用 Vite 内置 loadEnv 统一加载环境变量（无需手动解析 argv）
  // mode: 由启动命令自动传入（如 npm run dev 对应 development，npm run build 对应 production）
  // root: 环境变量文件所在根目录
  // '' : 前缀（留空表示加载所有变量，也可指定 VITE_ 只加载前缀变量）
  const env = loadEnv(mode, root, '')

  // 2. 类型断言：给 env 加上类型（避免 any 类型，更规范）
  const viteEnv = env as unknown as {
    VITE_BASE_URL: string
    VITE_PORT: number
    VITE_OPEN: string
    VITE_BASE_PATH: string
    VITE_TILE_PROXY: string // 控制瓦片代理是否启用（true/false）
    VITE_TILE_PATH: string  // 瓦片服务目标地址（如 http://localhost:8000/map）
    VITE_OUT_DIR?: string
    VITE_SOURCEMAP: string
    VITE_DROP_DEBUGGER: string
    VITE_DROP_CONSOLE: string
  }

  // 3. 代理配置：结构优化 + 瓦片代理逻辑修正
  const proxyConfig: Record<string, any> = {}

  // 3.1 原有 API 代理（保留，修复类型和逻辑）
  // if (viteEnv.VITE_BASE_URL) { // 避免空地址导致代理报错
  //   proxyConfig['/admin-api'] = {
  //     target: viteEnv.VITE_BASE_URL,
  //     ws: false, // 非 WebSocket 服务，保持 false
  //     changeOrigin: true, // 跨域必备：修改请求头的 Origin 为 target 地址
  //     rewrite: (path: string) => path.replace(/^\/admin-api/, ''), // 去掉 /admin-api 前缀
  //   }
  // }

  // 3.1 原有 API 代理（核心修正：删除 rewrite 规则）
  if (viteEnv.VITE_BASE_URL) {
    proxyConfig['/admin-api'] = {
      target: viteEnv.VITE_BASE_URL, // 此时是 http://127.0.0.1:9310（正确）
      ws: false,
      changeOrigin: true, // 跨域必备（保持不变）
      // 👇 关键：删除或注释这行 rewrite，避免删除 /admin-api 前缀
      // rewrite: (path) => path.replace(/^\/admin-api/, ''),
      // 👇 保留调试日志，方便确认转发结果
      configure: (proxy) => {
        proxy.on('proxyReq', (proxyReq, req) => {
          console.log('[API 代理成功]：',
            `原路径：${req.url} → 转发到：${proxyReq.protocol}//${proxyReq.host}${proxyReq.path}`
          );
        });
        proxy.on('error', (err) => {
          console.error('[API 代理错误]：', err.message);
        });
      }
    }
  }

  // 3.2 瓦片代理配置（核心修正：匹配前端请求路径 + 正确转发到目标地址）
  // 场景：前端请求 /map-tiles/{z}/{x}/{y}.png → 代理到 http://localhost:8000/map/{z}/{x}/{y}.png
  if (viteEnv.VITE_TILE_PROXY === 'true' && viteEnv.VITE_TILE_PATH) { // 双重判断，避免配置缺失
    proxyConfig['/map-tiles'] = {
      target: viteEnv.VITE_TILE_PATH, // 目标地址：http://localhost:8000/map（从 env 读取）
      changeOrigin: true, // 跨域必备
      ws: false, // 瓦片服务是 HTTP 请求，非 WebSocket
      rewrite: (path: string) => path.replace(/^\/map-tiles/, ''), // 关键：去掉前端请求的 /map-tiles 前缀
      // 调试用：打印代理日志（生产环境可注释）
      configure: (proxy: any) => {
        proxy.on('error', (err: Error) => {
          console.error('[瓦片代理错误]：', err.message)
        })
        proxy.on('proxyReq', (proxyReq: any, req: any) => {
          console.log('[瓦片代理请求]：', `原路径：${req.url} → 代理路径：${proxyReq.path}`)
        })
      }
    }
  }

  // 4. 返回 Vite 配置（保持原有功能，优化类型和默认值）
  return {
    base: viteEnv.VITE_BASE_PATH || '/', // 默认值：根路径（避免空值）
    root: root,
    server: {
      port: viteEnv.VITE_PORT || 3000, // 默认端口：3000（避免配置缺失导致启动失败）
      host: "0.0.0.0", // 允许局域网访问（如手机调试）
      open: viteEnv.VITE_OPEN === 'true', // 启动后自动打开浏览器
      proxy: proxyConfig, // 注入代理配置
      cors: true // 可选：允许前端直接跨域（代理生效时可省略，但开发环境建议开启）
    },
    plugins: createVitePlugins(), // 原有插件逻辑（保持不变）
    css: {
      preprocessorOptions: {
        scss: {
          additionalData: '@use "@/styles/variables.scss" as *;', // SCSS 全局变量
          javascriptEnabled: true,
          silenceDeprecations: ["legacy-js-api"], // 解决 Dart Sass 弃用警告
        }
      }
    },
    resolve: {
      extensions: ['.mjs', '.js', '.ts', '.jsx', '.tsx', '.json', '.scss', '.css'],
      alias: [
        { find: 'vue-i18n', replacement: 'vue-i18n/dist/vue-i18n.cjs.js' }, // Vue I18n 兼容配置
        { find: /\@\//, replacement: `${pathResolve('src')}/` } // 别名 @ 指向 src 目录
      ]
    },
    build: {
      minify: 'terser', // 生产环境压缩（terser 比 esbuild 压缩率更高）
      outDir: viteEnv.VITE_OUT_DIR || 'dist', // 默认输出目录：dist
      sourcemap: viteEnv.VITE_SOURCEMAP === 'true' ? 'inline' : false, // 生产环境 sourcemap 控制
      terserOptions: {
        compress: {
          drop_debugger: viteEnv.VITE_DROP_DEBUGGER === 'true', // 移除 debugger
          drop_console: viteEnv.VITE_DROP_CONSOLE === 'true', // 移除 console（生产环境建议开启）
        }
      },
      rollupOptions: {
        output: {
          manualChunks: { echarts: ['echarts'] } // 单独打包 echarts（减小主包体积）
        }
      },
    },
    optimizeDeps: { include, exclude } // 依赖预构建配置（保持不变）
  }
}
